﻿using System;
using System.Collections.Generic;
using Yhb.Business;
using Yhb.Config;
using Yhb.Utility;

namespace YhbExample
{
    class Program
    {
        static void Main(string[] args)
        {

            try
            {
                //下单
                //orderCreate();
                // 订单查询
                //orderQuery();
                // 退款申请
                //orderRefundApply();
                // 退款查询
                //orderRefundQuery();
                // 交易明细查询
                //tradeDetailQuery();
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("Error:" + ex.Message);
            }
            System.Console.ReadLine();
        }

        /// <summary>
        /// 创建订单
        /// </summary>
        private static void orderCreate()
        {
            string url = PayConfig.API_BASE_URL + PayConfig.ORDER_CREATE;

            Dictionary<string, object> paramDic = new Dictionary<string, object>();
            // 商户系统内部订单号，要求64个字符内，只能是数字、大小写字母_-|* 且在同一个商户号下唯一
            paramDic.Add("merchant_order_no", "M" + Guid.NewGuid());
            // 购买商品的标题，不同支付类型的长度要求不同，具体如下：微信扫码支付：128字节 支付宝扫码支付：128字节
            paramDic.Add("product_title", "收款");
            // 购买商品的描述信息，要求128个字符内
            paramDic.Add("product_desc", "收款满10减1");
            // 符合ISO 4217标准的三位字母代码，默认人民币：CNY
            paramDic.Add("currency", "CNY");
            // 订单总金额，单位为分
            paramDic.Add("amount", "100");
            // 订单描述，要求300个字符内，不能包含特殊字符:英文逗号，注意：下载对账单会返回此字段数据
            paramDic.Add("description", "扫码测试");
            // 交易类型:微信扫码支付:wechat_csb 支付宝扫码支付:alipay_csb 注:区分大小写
            paramDic.Add("trade_type", "wechat_csb");
            // 订单生成时间，格式为yyyyMMddHHmmss
            DateTime d = DateTime.Now;
            paramDic.Add("time_start", d.ToString("yyyyMMddHHmmss"));
            // 敏感字段加密时使用的密钥，如果报文中有敏感字段，此字段必传，注意:RSA加密之前密钥原文固定16个字符
            paramDic.Add("encrypted_key", "");
            // 异步通知地址URL 订单状态 成功或失败 时会根据此地址进行下发结果信息
            paramDic.Add("notify_url", "http://www.test.com");
            // 支付模式 为空或为1 则为 纯api模式 2 收银台模式
            paramDic.Add("pay_mode", "");
            // 分区名称或游戏名称 支付模式为2 收银台模式时，此数值必填
            paramDic.Add("partition_name", "");
            // 充值帐号 支付模式为2 收银台模式时，此数值必填
            paramDic.Add("game_account", "");
            // 前台通知URL 支付模式 为2 收银台模式时，平台才会同步通知该URL
            paramDic.Add("front_url", "");
            // 用户下单IP地址
            paramDic.Add("user_ip", "123.221.23.22");
            // 分账明细记录 注意：明细里的金额单位是元
            paramDic.Add("splitDetails","[{\"merchantId\":1002,\"splitAmt\":7.20}]");
            string jsonData = JsonUtility.ToJsonString(paramDic);

            Console.WriteLine("下单请求参数：" + jsonData);
            try
            {
                Dictionary<string, string> result = BaseBusiness.Request(url, jsonData);
                Console.WriteLine("下单响应报文：" + JsonUtility.ToJsonString(result));
            }
            catch (Exception e)
            {
                Console.WriteLine("下单异常:" + e.Message);
            }
        }

        /// <summary>
        /// 订单查询
        /// </summary>
        private static void orderQuery()
        {
            string url = PayConfig.API_BASE_URL + PayConfig.ORDER_QUERY;

            Dictionary<string, object> paramDic = new Dictionary<string, object>();
            // 商户系统内部订单号，要求64个字符内，只能是数字、大小写字母_-|* 且在同一个商户号下唯一
            paramDic.Add("merchant_order_no", "49b0f1dd741646d2b277524de2785836");
            // 分账通平台订单号
            paramDic.Add("order_no", "");

            string jsonData = JsonUtility.ToJsonString(paramDic);

            Console.WriteLine("订单查询请求参数："+jsonData);
            try
            {
                Dictionary<string, string> result = BaseBusiness.Request(url, jsonData);
                Console.WriteLine("订单查询响应报文：" + JsonUtility.ToJsonString(result));
            }
            catch(Exception e)
            {
                Console.WriteLine("订单查询异常:" + e.Message);
            }
        }

        /// <summary>
        /// 退款申请
        /// </summary>
        private static void orderRefundApply()
        {
            string url = PayConfig.API_BASE_URL + PayConfig.REFUND_APPLY;

            Dictionary<string, object> paramDic = new Dictionary<string, object>();
            // 商户系统内部退款订单号，要求64个字符内，只能是数字、大小写字母_-|* 且在同一个商户号下唯一
            paramDic.Add("merchant_refund_order_no", "MR" + Guid.NewGuid());
            // 退款金额，单位为分
            paramDic.Add("amount", "1");
            // 退款描述，要求300个字符内，不能包含特殊字符:英文逗号，注意：下载对账单会返回此字段数据
            paramDic.Add("description", "扫码测试");
            // 商户退款申请时间 格式:yyyyMMddHHmmss
            DateTime d = DateTime.Now;
            paramDic.Add("merchant_refund_apply_time", d.ToString("yyyyMMddHHmmss"));

            // 注意:商户原订单号或平台原订单号至少有一个数值不允许为空值
            // 商户原订单号
            paramDic.Add("merchant_order_no","");
            // 平台原订单号
            paramDic.Add("order_no", "PD201911071307427615049363456");

            // 异步通知地址URL 退款订单状态 成功或失败 时会根据此地址进行下发结果信息
            paramDic.Add("notify_url", "http://www.test.com");

            string jsonData = JsonUtility.ToJsonString(paramDic);

            Console.WriteLine("退款申请请求参数：" + jsonData);
            try
            {
                Dictionary<string, string> result = BaseBusiness.Request(url, jsonData);
                Console.WriteLine("退款申请响应报文：" + JsonUtility.ToJsonString(result));
            }
            catch (Exception e)
            {
                Console.WriteLine("退款申请异常:" + e.Message);
            }
        }

        /// <summary>
        /// 退款查询
        /// </summary>
        private static void orderRefundQuery()
        {
            string url = PayConfig.API_BASE_URL + PayConfig.REFUND_QUERY;
            Dictionary<string, object> paramDic = new Dictionary<string, object>();
            // 注意：以下4个参数必须有一个不允许为空值
             // 商户原订单号
            paramDic.Add("merchant_order_no","");
            // 平台原订单号
            paramDic.Add("order_no","");
            // 商户系统内部退款订单号
            paramDic.Add("merchant_refund_order_no","");
           // 分账通平台退款订单号
           paramDic.Add("refund_order_no","");

            string jsonData = JsonUtility.ToJsonString(paramDic);
            Console.WriteLine("退款查询请求参数：" + jsonData);
            try
            {
                Dictionary<string, string> result = BaseBusiness.Request(url, jsonData);
                Console.WriteLine("退款查询响应报文：" + JsonUtility.ToJsonString(result));
            }
            catch (Exception e)
            {
                Console.WriteLine("退款查询异常:" + e.Message);
            }
        }

        /// <summary>
        /// 交易明细查询
        /// </summary>
        private static void tradeDetailQuery()
        {
            string url = PayConfig.API_BASE_URL + PayConfig.TRADE_DETAIL_QUERY;
            Dictionary<string, object> paramDic = new Dictionary<string, object>();
            // 第几页
            paramDic.Add("pageNum",1);
            // 每页条数
            paramDic.Add("pageSize",50);
            // 开始时间 格式：yyyy-MM-dd HH:mm:ss
            paramDic.Add("startTime", "2024-05-03 11:22:32");
            // 结束时间 格式：yyyy-MM-dd HH:mm:ss
            paramDic.Add("endTime", "2024-05-03 11:22:32");

            string jsonData = JsonUtility.ToJsonString(paramDic);
            Console.WriteLine("交易明细查询请求参数：" + jsonData);
            try
            {
                Dictionary<string, string> result = BaseBusiness.Request(url, jsonData);
                Console.WriteLine("交易明细查询响应报文：" + JsonUtility.ToJsonString(result));
            }
            catch (Exception e)
            {
                Console.WriteLine("交易明细查询异常:" + e.Message);
            }
        }

    }
}
